#define JPEG_INTERNALS
#include "jinclude.h"
#include "jpeglib.h"

const int jpeg_natural_order[DCTSIZE2 + 16] = {
  0,  1,  8, 16,  9,  2,  3, 10,
  17, 24, 32, 25, 18, 11,  4,  5,
  12, 19, 26, 33, 40, 48, 41, 34,
  27, 20, 13,  6,  7, 14, 21, 28,
  35, 42, 49, 56, 57, 50, 43, 36,
  29, 22, 15, 23, 30, 37, 44, 51,
  58, 59, 52, 45, 38, 31, 39, 46,
  53, 60, 61, 54, 47, 55, 62, 63,
  63, 63, 63, 63, 63, 63, 63, 63,
  63, 63, 63, 63, 63, 63, 63, 63
};

long jdiv_round_up( long a, long b ) {
  return ( a + b - 1L ) / b;
}

long jround_up( long a, long b ) {
  a += b - 1L;
  return a - ( a % b );
}

#ifndef NEED_FAR_POINTERS	/* normal case, same as regular macros */
#define FMEMCOPY(dest,src,size)	MEMCOPY(dest,src,size)
#define FMEMZERO(target,size)	MEMZERO(target,size)
#else				/* 80x86 case, define if we can */
#ifdef USE_FMEM
#define FMEMCOPY(dest,src,size)	_fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
#define FMEMZERO(target,size)	_fmemset((void FAR *)(target), 0, (size_t)(size))
#endif
#endif

void jcopy_sample_rows( JSAMPARRAY input_array, int source_row,
                        JSAMPARRAY output_array, int dest_row,
                        int num_rows, JDIMENSION num_cols ) {
  register JSAMPROW inptr, outptr;
  #ifdef FMEMCOPY
  register size_t count = ( size_t )( num_cols * SIZEOF( JSAMPLE ) );
  #else
  register JDIMENSION count;
  #endif
  register int row;
  input_array += source_row;
  output_array += dest_row;
  for( row = num_rows; row > 0; row-- ) {
    inptr = *input_array++;
    outptr = *output_array++;
    #ifdef FMEMCOPY
    FMEMCOPY( outptr, inptr, count );
    #else
    for( count = num_cols; count > 0; count-- )
    { *outptr++ = *inptr++; }
    #endif
  }
}

void jcopy_block_row( JBLOCKROW input_row, JBLOCKROW output_row, JDIMENSION num_blocks ) {
  #ifdef FMEMCOPY
  FMEMCOPY( output_row, input_row, num_blocks * ( DCTSIZE2 * SIZEOF( JCOEF ) ) );
  #else
  register JCOEFPTR inptr, outptr;
  register long count;
  inptr = ( JCOEFPTR ) input_row;
  outptr = ( JCOEFPTR ) output_row;
  for( count = ( long ) num_blocks * DCTSIZE2; count > 0; count-- ) {
    *outptr++ = *inptr++;
  }
  #endif
}

void jzero_far( void FAR * target, size_t bytestozero ) {
  #ifdef FMEMZERO
  FMEMZERO( target, bytestozero );
  #else
  register char FAR * ptr = ( char FAR * ) target;
  register size_t count;
  for( count = bytestozero; count > 0; count-- ) {
    *ptr++ = 0;
  }
  #endif
}
